home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / pao / pvs_pvd / src / pvd.c < prev    next >
Text File  |  1994-06-01  |  33KB  |  938 lines

  1. /* << HighC V1.7 >> [FM-TOWNS] **********************************************
  2. *
  3. *    .PVS 表示プログラム
  4. *    ----------------------------------------------------------------------
  5. *    Programmed by Y.Hirata ( NIFTY-ID: NAB03321  パオパオ )
  6. *
  7. *    NOTE: TAB=4
  8. ****************************************************************************/
  9.  
  10. #include <string.h>        /*  movedata    */
  11. #include <stdlib.h>        /*  malloc,free    */
  12. #include <conio.h>        /*  inp,outp    */
  13. #include <fmcfrb.h>        /*  TIM_*        */
  14. #include <msdos.cf>        /*  getds        */
  15. #include <mos.h>        /*  MOS_*        */
  16. #include <snd.h>        /*  SND_*        */
  17. #include "egbtxt.h"
  18. #include "pvd.h"
  19. #include "tiffhead.h"
  20.  
  21. char    Mwork[MosWorkSize] ;                    /*  MOS作業領域            */
  22. char    _mos_cur[258] ;                            /*  マウスカーソル(アイコン)        */
  23. char    _tmp[TMP_SIZE] ;                        /*  作業領域            */
  24.  
  25. _PAL_16        _palini = {    16,                        /*  16色デフォルトパレット        */
  26.                         0,        0x00,    0x00,    0x00,    0,
  27.                         1,        0xB0,    0x00,    0x00,    0,
  28.                         2,        0x00,    0xB0,    0x00,    0,
  29.                         3,        0xB0,    0xB0,    0x00,    0,
  30.                         4,        0x00,    0x00,    0xB0,    0,
  31.                         5,        0xB0,    0x00,    0xB0,    0,
  32.                         6,        0x00,    0xB0,    0xB0,    0,
  33.                         7,        0xB0,    0xB0,    0xB0,    0,
  34.                         8,        0x00,    0x00,    0x00,    0,
  35.                         9,        0xF0,    0x00,    0x00,    0,
  36.                         10,        0x00,    0xF0,    0x00,    0,
  37.                         11,        0xF0,    0xF0,    0x00,    0,
  38.                         12,        0x00,    0x00,    0xF0,    0,
  39.                         13,        0xF0,    0x00,    0xF0,    0,
  40.                         14,        0x00,    0xF0,    0xF0,    0,
  41.                         15,        0xF0,    0xF0,    0xF0,    0
  42. } ;
  43. _PAL_16        _pal160, _pal161 ;                    /*  16色パレット設定用        */
  44. _PAL_256    _pal256 ;                            /*  256色パレット設定用    */
  45.  
  46. char    *_msg[] = {
  47.         "page 0                                        page 1      表示",
  48.         " 1 ( 640 * 400  16   24KHz  ノンインタレース )        1       page 0",
  49.         " 2 ( 640 * 200  16   24KHz  ノンインタレース )        2       page 1",
  50.         " 3 ( 640 * 480  16   31KHz  ノンインタレース )        3       0 前面",
  51.         " 4 ( 640 * 400  16   24KHz  ノンインタレース )        4       1 前面",
  52.         " 5 ( 256 * 256  32K  31KHz  ノンインタレース )        5",
  53.         " 6 ( 256 * 256  32K  24KHz  ノンインタレース )        6       X0 1倍",
  54.         " 7 ( 256 * 240  32K  15KHz    インタレース )        7          2倍",
  55.         " 8 ( 256 * 240  32K  15KHz  ノンインタレース )        8          4倍",
  56.         " 9 ( 360 * 240  32K  15KHz    インタレース )        9       Y0 1倍",
  57.         "10 ( 320 * 240  32K  31KHz  ノンインタレース )      10          2倍",
  58.         "11 ( 320 * 240  32K  15KHz  ノンインタレース )      11          4倍",
  59.         "12 ( 640 * 480  256  31KHz  ノンインタレース )                 X1 1倍",
  60.         "13 ( 640 * 400  256  24KHz  ノンインタレース )                    2倍",
  61.         "14 ( 720 * 480  256  15KHz    インタレース )     MS-DOS         4倍",
  62.         "15 ( 320 * 480  32K  31KHz  ノンインタレース )                 Y1 1倍",
  63.         "16 ( 320 * 480  32K  15KHz    インタレース )                    2倍",
  64.         "17 ( 512 * 480  32K  31KHz  ノンインタレース )                    4倍",
  65.         "18 ( 512 * 480  32K  15KHz    インタレース )",
  66.         "実行   終了   TIFF保存"
  67. } ;
  68.  
  69. struct {
  70.     int        xs, ys ;
  71.     int        xe, ye ;
  72. } _dpara[] = {
  73. /*  0    */        {    48,        40,        -1,        55        },        /*  タイトル    */
  74. /*  1    */        {    48,        60,        367,    75        },        /*  0-1        */
  75. /*  2    */        {    48,        80,        367,    95        },        /*  0-2        */
  76. /*  3    */        {    48,        100,    367,    115        },        /*  0-3        */
  77. /*  4    */        {    48,        120,    367,    135        },        /*  0-4        */
  78. /*  5    */        {    48,        140,    367,    155        },        /*  0-5        */
  79. /*  6    */        {    48,        160,    367,    175        },        /*  0-6        */
  80. /*  7    */        {    48,        180,    367,    195        },        /*  0-7        */
  81. /*  8    */        {    48,        200,    367,    215        },        /*  0-8        */
  82. /*  9    */        {    48,        220,    367,    235        },        /*  0-9        */
  83. /*  10    */        {    48,        240,    367,    255        },        /*  0-10    */
  84. /*  11    */        {    48,        260,    367,    275        },        /*  0-11    */
  85. /*  12    */        {    48,        280,    367,    295        },        /*  0-12    */
  86. /*  13    */        {    48,        300,    367,    315        },        /*  0-13    */
  87. /*  14    */        {    48,        320,    367,    335        },        /*  0-14    */
  88. /*  15    */        {    48,        340,    367,    355        },        /*  0-15    */
  89. /*  16    */        {    48,        360,    367,    375        },        /*  0-16    */
  90. /*  17    */        {    48,        380,    367,    395        },        /*  0-17    */
  91. /*  18    */        {    48,        400,    367,    415        },        /*  0-18    */
  92. /*  19    */        {    416,    60,        447,    75        },        /*  1-1        */
  93. /*  20    */        {    416,    80,        447,    95        },        /*  1-2        */
  94. /*  21    */        {    416,    100,    447,    115        },        /*  1-3        */
  95. /*  22    */        {    416,    120,    447,    135        },        /*  1-4        */
  96. /*  23    */        {    416,    140,    447,    155        },        /*  1-5        */
  97. /*  24    */        {    416,    160,    447,    175        },        /*  1-6        */
  98. /*  25    */        {    416,    180,    447,    195        },        /*  1-7        */
  99. /*  26    */        {    416,    200,    447,    215        },        /*  1-8        */
  100. /*  27    */        {    416,    220,    447,    235        },        /*  1-9        */
  101. /*  28    */        {    416,    240,    447,    255        },        /*  1-10    */
  102. /*  29    */        {    416,    260,    447,    275        },        /*  1-11    */
  103. /*  30    */        {    504,    60,        551,    75        },        /*  page0    */
  104. /*  31    */        {    504,    80,        551,    95        },        /*  page1    */
  105. /*  32    */        {    504,    100,    551,    115        },        /*  0前面    */
  106. /*  33    */        {    504,    120,    551,    135        },        /*  1前面    */
  107. /*  34    */        {    384,    420,    415,    435        },        /*  実行    */
  108. /*  35    */        {    440,    420,    471,    435        },        /*  終了    */
  109. /*  36    */        {    504,    160,    551,    175        },        /*  0 X1倍    */
  110. /*  37    */        {    504,    180,    551,    195        },        /*  0 X2倍    */
  111. /*  38    */        {    504,    200,    551,    215        },        /*  0 X4倍    */
  112. /*  39    */        {    504,    220,    551,    235        },        /*  0 Y1倍    */
  113. /*  40    */        {    504,    240,    551,    255        },        /*  0 Y2倍    */
  114. /*  41    */        {    504,    260,    551,    275        },        /*  0 Y4倍    */
  115. /*  42    */        {    504,    280,    551,    295        },        /*  1 X1倍    */
  116. /*  43    */        {    504,    300,    551,    315        },        /*  1 X2倍    */
  117. /*  44    */        {    504,    320,    551,    335        },        /*  1 X4倍    */
  118. /*  45    */        {    504,    340,    551,    355        },        /*  1 Y1倍    */
  119. /*  46    */        {    504,    360,    551,    375        },        /*  1 Y2倍    */
  120. /*  47    */        {    504,    380,    551,    395        },        /*  1 Y4倍    */
  121. /*  48    */        {    408,    320,    455,    335        },        /*  MS-DOS    */
  122. /*  49    */        {    496,    420,    559,    435        }        /*  TIF保存    */
  123. } ;
  124.  
  125. _SELECT_PARA    _para = {                        /*  選択状態の情報        */
  126.                 NULL,    NULL,    NULL,
  127.                 3,    3,    3,
  128.                 1,1,    1,1,    0,0,    0,0,    0,0,    0,0,
  129.                 0,0,    0,0
  130. } ;
  131.  
  132. _SCREEN_PARA    _screen[] = {                    /*  画面モードの情報        */
  133.                 {    4,    640,400,    640, 819,    1,1        },    /*   1:16    */
  134.                 {    4,    640,200,    640, 819,    1,2        },    /*   2:16    */
  135.                 {    4,    640,480,    1024,512,    1,1        },    /*   3:16    */
  136.                 {    4,    640,400,    1024,512,    1,1        },    /*   4:16    */
  137.                 {    16,    256,256,    256, 512,    1,1        },    /*   5:32K    */
  138.                 {    16,    256,256,    256, 512,    1,1        },    /*   6:32K    */
  139.                 {    16,    256,240,    256, 512,    3,1        },    /*   7:32K    */
  140.                 {    16,    256,240,    256, 512,    3,1        },    /*   8:32K    */
  141.                 {    16,    360,240,    512, 256,    3,1        },    /*   9:32K    */
  142.                 {    16,    320,240,    512, 256,    1,1        },    /*  10:32K    */
  143.                 {    16,    320,240,    512, 256,    3,1        },    /*  11:32K    */
  144.                 {    8,    640,480,    1024,512,    1,1        },    /*  12:256    */
  145.                 {    8,    640,400,    1024,512,    1,1        },    /*  13:256    */
  146.                 {    8,    720,480,    1024,512,    2,1        },    /*  14:256    */
  147.                 {    16,    320,480,    512, 512,    2,1        },    /*  15:32K    */
  148.                 {    16,    320,480,    512, 512,    3,1        },    /*  16:32K    */
  149.                 {    16,    512,480,    512, 512,    1,1        },    /*  17:32K    */
  150.                 {    16,    512,480,    512, 512,    1,1        }    /*  18:32K    */
  151. } ;                                    /*  初期倍率 : 1=1倍, 2=2倍, 3=4倍    */
  152.  
  153. /*  MS-DOS mode
  154. ---------------- */
  155. int        _crtc[] = {
  156.         0x0040,0x0320,0x0000,0x0000,0x035F,0x0000,0x0010,0x0000,
  157.         0x036F,0x009C,0x031C,0x009C,0x031C,0x0040,0x0360,0x0040,
  158.         0x0360,0x0000,0x009C,0x0000,0x0050,0x0000,0x009C,0x0000,
  159.         0x0080,0x004A,0x0001,0x0000,0x001F,0x0003,0x0000,0x0150
  160. } ;
  161. #if 0
  162. char     _vdc[] = {    0x15,0x09    } ;
  163. #endif
  164. int        _crtc_dos[] = {
  165.         0x0040,0x0320,0x0000,0x0000,0x035F,0x0000,0x0010,0x0000,
  166.         0x036F,0x009C,0x031C,0x009C,0x031C,0x0040,0x0360,0x0040,
  167.         0x0360,0x0000,0x009C,0x0000,0x0050,0x0000,0x009C,0x0000,
  168.         0x0080,0x004A,0x0001,0x0000,0x001F,0x0003,0x0000,0x0150
  169. } ;
  170.  
  171. long     _tim0=0 ;                                /*  カウンタ                */
  172. long     _tim1=0 ;                                /*  カウンタ                */
  173.  
  174. static int int_handler( void )
  175. {
  176.     _tim0++ ;
  177.     _tim1++ ;
  178.     return 0 ;
  179. }
  180.  
  181. void crtc_out( int reg )
  182. {
  183.     outp( 0x440,reg ) ;
  184.     outpw( 0x442,_crtc[reg] ) ;
  185. }
  186.  
  187. void mosBreak( void )
  188. {
  189.     int        mbot, mx, my ;
  190.  
  191.     do {
  192.         MOS_rdpos( &mbot,&mx,&my ) ;            /*  マウス情報取得            */
  193.     } while ( mbot ) ;                            /*  ボタンonの間            */
  194. }
  195.  
  196. int mosButton( void )
  197. {
  198.     int        mbot, mx, my ;
  199.  
  200.     MOS_rdpos( &mbot,&mx,&my ) ;                /*  マウス情報取得            */
  201.     return mbot ;
  202. }
  203.  
  204. void ginit( void )
  205. {
  206.     EGB_init( Gwork,EgbWorkSize ) ;                /*  初期化                */
  207.     EGB_resolution( Gwork,0,3 ) ;                /*  page0 16 color        */
  208.     EGB_resolution( Gwork,1,3 ) ;                /*  page1 16 color        */
  209.     EGB_displayPage( Gwork,0,1 ) ;                /*  page0のみ表示        */
  210.     EGB_writePage( Gwork,0 ) ;                    /*  page0を処理開始        */
  211.     EGB_paintMode( Gwork,0x02 ) ;
  212.     EGB_writeMode( Gwork,M_OPAQUE ) ;
  213.     EGB_palette( Gwork,0,(char *)&_palini ) ;    /*  VSYNC待たずに設定    */
  214.     EGB_color( Gwork,C_FRONT,C_HWHITE ) ;        /*  文字色                */
  215.     EGB_color( Gwork,C_BACK,C_BLACK ) ;            /*  背景色                */
  216.     EGB_clearScreen( Gwork ) ;                    /*  画面クリア                */
  217. }
  218.  
  219. void minit( void )
  220. {
  221.     MOS_start( Mwork,MosWorkSize ) ;            /*  初期化                */
  222.     MOS_resolution( 0,3 ) ;                        /*  page0, 16 color        */
  223.     MOS_typeRom( 87,0,0,_mos_cur ) ;            /*  マウス形状変更            */
  224.     MOS_color( 0,C_HWHITE ) ;                    /*  マウス表示色設定        */
  225.     MOS_setpos( 320,240 ) ;                        /*  画面中央            */
  226.     MOS_disp( FALSE ) ;                            /*  非表示                */
  227. }
  228.  
  229. void to_vram( void )
  230. {
  231.     int        cnt, off ;
  232.  
  233.     if ( _para.buf != NULL ) {
  234.         movedata( getds(),(unsigned int)_para.buf,0x120,0,VRAM_SIZE ) ;
  235.         return ;
  236.     }
  237.     if ( fseek( _para.fp,VRAM_OFFSET,SEEK_SET ) ) return ;
  238.     for ( cnt=0, off=0; cnt<512; cnt++, off+=TMP_SIZE ) {
  239.         if ( fread( _tmp,1,TMP_SIZE,_para.fp ) != TMP_SIZE ) break ;
  240.         movedata( getds(),(unsigned int)_tmp,0x120,off,TMP_SIZE ) ;
  241.     }
  242. }
  243.  
  244. void reverse( int old,int new )
  245. {
  246.     int        xs, ys, xe, ye ;
  247.  
  248.     if ( old == new ) return ;
  249.     MOS_disp( FALSE ) ;                            /*  マウス非表示            */
  250.     if ( old > SEL_TIT && old < SEL_MAX ) {
  251.         xs = _dpara[old].xs - 2 ;
  252.         ys = _dpara[old].ys - 1 ;
  253.         xe = _dpara[old].xe + 2 ;
  254.         ye = _dpara[old].ye + 1 ;
  255.         box( xs,ys,xe,ye ) ;
  256.     }
  257.     if ( new > SEL_TIT && new < SEL_MAX ) {
  258.         xs = _dpara[new].xs - 2 ;
  259.         ys = _dpara[new].ys - 1 ;
  260.         xe = _dpara[new].xe + 2 ;
  261.         ye = _dpara[new].ye + 1 ;
  262.         box( xs,ys,xe,ye ) ;
  263.     }
  264.     MOS_disp( TRUE ) ;                            /*  マウス表示                */
  265. }
  266.  
  267. int select_msdos( void )
  268. {
  269.     if ( _para.p0 < 1 ) return 1 ;                /*  MS-DOSだった        */
  270.     reverse( _para.p0,-1 ) ;                    /*  page0のモード解除        */
  271.     reverse( _para.disp+D0_0-1,-1 ) ;            /*  表示ページ解除        */
  272.     reverse( _para.zx0+P0_X1-1,-1 ) ;            /*  page0のX倍率解除    */
  273.     reverse( _para.zy0+P0_Y1-1,-1 ) ;            /*  page0のY倍率解除    */
  274.     if ( _para.p0 < 12 ) {                        /*  2画面モードだった        */
  275.         reverse( _para.p1+P1_1-1,-1 ) ;            /*  page1のモード解除        */
  276.         reverse( _para.zx1+P1_X1-1,-1 ) ;        /*  page1のX倍率解除    */
  277.         reverse( _para.zy1+P1_Y1-1,-1 ) ;        /*  page1のY倍率解除    */
  278.     }
  279.     _para.disp = 4 ;                            /*  page1前面            */
  280.     reverse( -1,_para.disp+D0_0-1 ) ;            /*  表示ページ設定        */
  281.  
  282.     _para.zx0 = _para.zy0 = 1 ;
  283.     reverse( -1,_para.zx0+P0_X1-1 ) ;            /*  page0のX倍率設定    */
  284.     reverse( -1,_para.zy0+P0_Y1-1 ) ;            /*  page0のY倍率設定    */
  285.  
  286.     _para.zx1 = _para.zy1 = 1 ;
  287.     reverse( -1,_para.zx1+P1_X1-1 ) ;            /*  page1のX倍率設定    */
  288.     reverse( -1,_para.zy1+P1_Y1-1 ) ;            /*  page1のY倍率設定    */
  289.  
  290.     _para.p0 = _para.p1 = -1 ;                    /*  page0/1モード無効        */
  291.     return 0 ;
  292. }
  293.  
  294. int select_page0( int sel )
  295. {
  296.     if ( _para.p0 < 0 ) {                        /*  MS-DOSだった        */
  297.         reverse( SEL_DOS,-1 ) ;                    /*  MS-DOS解除            */
  298.     } else {                                    /*  MS-DOSではなかった    */
  299.         reverse( _para.p0,-1 ) ;                /*  page0のモード解除        */
  300.         if ( _para.p0 < 12 ) {                    /*  2画面モードだった        */
  301.             reverse( _para.p1+P1_1-1,-1 ) ;        /*  page1のモード解除        */
  302.         }
  303.     }
  304.     reverse( _para.disp+D0_0-1,-1 ) ;            /*  表示ページ解除        */
  305.     reverse( _para.zx0+P0_X1-1,-1 ) ;            /*  page0のX倍率解除    */
  306.     reverse( _para.zy0+P0_Y1-1,-1 ) ;            /*  page0のY倍率解除    */
  307.     if ( _para.p0 < 12 ) {                        /*  2画面モードだった        */
  308.         reverse( _para.zx1+P1_X1-1,-1 ) ;        /*  page1のX倍率解除    */
  309.         reverse( _para.zy1+P1_Y1-1,-1 ) ;        /*  page1のY倍率解除    */
  310.     }
  311.  
  312.     _para.zx0 = _screen[sel-1].zx ;
  313.     _para.zy0 = _screen[sel-1].zy ;
  314.     reverse( -1,_para.zx0+P0_X1-1 ) ;            /*  page0のX倍率設定    */
  315.     reverse( -1,_para.zy0+P0_Y1-1 ) ;            /*  page0のY倍率設定    */
  316.     if ( sel < 12 ) {                            /*  2画面モード            */
  317.         _para.p1 = sel ;
  318.         reverse( -1,_para.p1+P1_1-1 ) ;            /*  page1の画面モード設定    */
  319.         _para.disp = 3 ;                        /*  page0前面            */
  320.         reverse( -1,_para.disp+D0_0-1 ) ;        /*  表示ページ設定        */
  321.         _para.zx1 = _screen[sel-1].zx ;
  322.         _para.zy1 = _screen[sel-1].zy ;
  323.         reverse( -1,_para.zx1+P1_X1-1 ) ;        /*  page1のX倍率設定    */
  324.         reverse( -1,_para.zy1+P1_Y1-1 ) ;        /*  page1のY倍率設定    */
  325.     } else {                                    /*  1画面モード            */
  326.         _para.p1 = -1 ;                            /*  page1の画面モード無効    */
  327.         _para.disp = 1 ;                        /*  page0のみ表示        */
  328.         reverse( -1,_para.disp+D0_0-1 ) ;        /*  表示ページ設定        */
  329.         _para.zx1 = _para.zy1 = -1 ;            /*  page1の倍率無効        */
  330.     }
  331.     _para.p0 = sel ;                            /*  page0の画面モード        */
  332.     return 0 ;
  333. }
  334.  
  335. int page1_check( int p1 )
  336. {
  337.     if ( _para.p0 == 1 ) {
  338.         if ( p1 == 1 || p1 == 4 ) return 0 ;
  339.     } else if ( _para.p0 == 2 ) {
  340.         if ( p1 == 2 ) return 0 ;
  341.     } else if ( _para.p0 == 3 || _para.p0 == 5 || _para.p0 == 10 ) {
  342.         if ( p1 == 3 || p1 == 5 || p1 == 10 ) return 0 ;
  343.     } else if ( _para.p0 == 4 || _para.p0 == 6 ) {
  344.         if ( p1 == 4 || p1 == 6 ) return 0 ;
  345.     } else if ( _para.p0 == 7 || _para.p0 == 9 ) {
  346.         if ( p1 == 7 || p1 == 9 ) return 0 ;
  347.     } else if ( _para.p0 == 8 || _para.p0 == 11 ) {
  348.         if ( p1 == 8 || p1 == 11 ) return 0 ;
  349.     }
  350.     return 1 ;
  351. }
  352.  
  353. int select_page1( int sel )
  354. {
  355.     if ( _para.p0 < 1 || _para.p0 > 11 ) return 1 ;
  356.     sel -= ( P1_1 - 1 ) ;
  357.     if ( page1_check( sel ) ) return 1 ;
  358.     reverse( _para.p1+P1_1-1,-1 ) ;                /*  選択状態解除        */
  359.     reverse( _para.disp+D0_0-1,-1 ) ;            /*  表示ページ解除        */
  360.     _para.disp = 4 ;                            /*  page1前面            */
  361.     reverse( -1,_para.disp+D0_0-1 ) ;            /*  表示ページ設定        */
  362.     reverse( _para.zx1+P1_X1-1,-1 ) ;            /*  page1のX倍率解除    */
  363.     reverse( _para.zy1+P1_Y1-1,-1 ) ;            /*  page1のY倍率解除    */
  364.     _para.zx1 = _screen[sel-1].zx ;
  365.     _para.zy1 = _screen[sel-1].zy ;
  366.     reverse( -1,_para.zx1+P1_X1-1 ) ;            /*  page1のX倍率設定    */
  367.     reverse( -1,_para.zy1+P1_Y1-1 ) ;            /*  page1のY倍率設定    */
  368.     _para.p1 = sel ;                            /*  page1の画面モード        */
  369.     return 0 ;
  370. }
  371.  
  372. int select_disp( int sel )
  373. {
  374.     sel -= ( D0_0 - 1 ) ;
  375.     if ( _para.p0 >= 12 && sel != 1 ) return 1 ;    /*  1画面モード        */
  376.     reverse( _para.disp+D0_0-1,-1 ) ;            /*  表示ページ解除        */
  377.     _para.disp = sel ;                            /*  表示ページ選択        */
  378.     return 0 ;
  379. }
  380.  
  381. int select_zoom( int sel )
  382. {
  383.     if ( sel < P0_Y1 ) {                        /*  page0 X                */
  384.         sel -= ( P0_X1 - 1 ) ;
  385.         if ( _para.p0 >= 0 ) {                    /*  MS-DOS以外            */
  386.             if ( sel < _screen[_para.p0-1].zx ) return 1 ;
  387.         }
  388.         reverse( _para.zx0+P0_X1-1,-1 ) ;
  389.         _para.zx0 = sel ;
  390.     } else if ( sel < P1_X1 ) {                    /*  page0 Y                */
  391.         sel -= ( P0_Y1 - 1 ) ;
  392.         if ( _para.p0 >= 0 ) {                    /*  MS-DOS以外            */
  393.             if ( sel < _screen[_para.p0-1].zy ) return 1 ;
  394.         }
  395.         reverse( _para.zy0+P0_Y1-1,-1 ) ;
  396.         _para.zy0 = sel ;
  397.     } else if ( sel < P1_Y1 ) {                    /*  page1 X                */
  398.         if ( _para.p0 >= 12 ) return 1 ;        /*  1画面モード            */
  399.         sel -= ( P1_X1 - 1 ) ;
  400.         if ( _para.p0 >= 0 ) {                    /*  MS-DOS以外            */
  401.             if ( sel < _screen[_para.p1-1].zx ) return 1 ;
  402.         }
  403.         reverse( _para.zx1+P1_X1-1,-1 ) ;
  404.         _para.zx1 = sel ;
  405.     } else {                                    /*  page1 Y                */
  406.         if ( _para.p0 >= 12 ) return 1 ;        /*  1画面モード            */
  407.         sel -= ( P1_Y1 - 1 ) ;
  408.         if ( _para.p0 >= 0 ) {                    /*  MS-DOS以外            */
  409.             if ( sel < _screen[_para.p1-1].zy ) return 1 ;
  410.         }
  411.         reverse( _para.zy1+P1_Y1-1,-1 ) ;
  412.         _para.zy1 = sel ;
  413.     }
  414.     return 0 ;
  415. }
  416.  
  417. void select_on( int old,int new )
  418. {
  419.     int        ret ;
  420.  
  421.     if ( new <= SEL_TIT || new >= SEL_MAX ) return ;
  422.     reverse( old,-1 ) ;                            /*  カレント位置表示解除    */
  423.     EGB_color( Gwork,C_PAINT,C_HLBLUE ) ;        /*  面塗り色            */
  424.     if ( new == SEL_DOS ) {                        /*  MS-DOS                */
  425.         ret = select_msdos() ;
  426.     } else if ( new < P1_1 ) {                    /*  page0のモード            */
  427.         ret = select_page0( new ) ;
  428.     } else if ( new < D0_0 ) {                    /*  page1のモード            */
  429.         ret = select_page1( new ) ;
  430.     } else if ( new < P0_X1 ) {                    /*  表示画面            */
  431.         ret = select_disp( new ) ;
  432.     } else {                                    /*  表示拡大            */
  433.         ret = select_zoom( new ) ;
  434.     }
  435.     if ( !ret ) reverse( -1,new ) ;                /*  選択OK!                */
  436.     EGB_color( Gwork,C_PAINT,C_WHITE ) ;        /*  面塗り色            */
  437.     reverse( -1,new ) ;                            /*  カレント位置表示設定    */
  438. }
  439.  
  440. int select( void )
  441. {
  442.     int        mbot, mx, my ;
  443.     int        cnt, sel=-1 ;
  444.  
  445.     MOS_disp( TRUE ) ;                            /*  マウス表示                */
  446.     EGB_paintMode( Gwork,0x20 ) ;                /*  面塗り                */
  447.     EGB_writeMode( Gwork,M_XOR ) ;                /*  XOR描画                */
  448.     EGB_color( Gwork,C_PAINT,C_WHITE ) ;        /*  面塗り色            */
  449.     mosBreak() ;                                /*  マウス開放待ち            */
  450.     while ( TRUE ) {
  451.         MOS_rdpos( &mbot,&mx,&my ) ;            /*  マウス情報取得            */
  452.         for ( cnt=P0_1; cnt<SEL_MAX; cnt++ ) {
  453.             if ( _dpara[cnt].xs > mx || _dpara[cnt].xe < mx ) continue ;
  454.             if ( _dpara[cnt].ys > my || _dpara[cnt].ye < my ) continue ;
  455.             break ;
  456.         }
  457.         if ( cnt >= SEL_MAX ) cnt = -1 ;
  458.         if ( mbot == MOS_RIGHT && cnt == SEL_TIF ) {    /*  仮想画面    */
  459.             reverse( sel,cnt ) ;
  460.             savesize( TRUE ) ;
  461.             break ;
  462.         }
  463.         if ( mbot == MOS_LEFT && cnt > SEL_TIT ) {    /*  マウス左クリック        */
  464.             if ( cnt == SEL_EXEC || cnt == SEL_END || cnt == SEL_TIF ) {
  465.                 reverse( sel,cnt ) ;
  466.                 if ( cnt == SEL_TIF ) savesize( FALSE ) ;
  467.                 break ;
  468.             }
  469.             select_on( sel,cnt ) ;
  470.             mosBreak() ;                        /*  マウス開放待ち            */
  471.         } else if ( sel != cnt ) {
  472.             reverse( sel,cnt ) ;
  473.         }
  474.         sel = cnt ;
  475.     }
  476.     EGB_displayPage( Gwork,0,0 ) ;                /*  画面非表示            */
  477.     mosBreak() ;                                /*  マウス開放待ち            */
  478.     MOS_disp( FALSE ) ;                            /*  マウス非表示            */
  479.     return cnt ;
  480. }
  481.  
  482. void setdos( void )
  483. {
  484.     int        cnt, off ;
  485.     int        zx0, zy0, zx1, zy1 ;
  486.  
  487.     for ( cnt=0; cnt<32; cnt++ ) _crtc[cnt] = _crtc_dos[cnt] ;
  488.     zx0 = _para.zx0 == 3 ? 3 : (_para.zx0-1) ;
  489.     zy0 = _para.zy0 == 3 ? 3 : (_para.zy0-1) ;
  490.     zx1 = _para.zx1 == 3 ? 3 : (_para.zx1-1) ;
  491.     zy1 = _para.zy1 == 3 ? 3 : (_para.zy1-1) ;
  492.     _crtc[0x1B] = (zy1<<12) + (zx1<<8) + (zy0<< 4) + zx0 ;
  493.  
  494.     outp( 0x440,0x1C ) ;                        /*  CR0                    */
  495.     outp( 0x443,0 ) ;                            /*  CRTC stop            */
  496.     while ( inp( 0x443 ) & 0x80 ) ;                /*  busy check            */
  497.  
  498.     for ( cnt=0; cnt<32; cnt++ ) {                /*  CRTC内部レジスタ        */
  499.         crtc_out( cnt ) ;
  500.     }
  501.     outp( 0x440,0x1C ) ;                        /*  CR0                    */
  502.     outp( 0x443,((_crtc[0x1C] >> 8) | 0x80) ) ;    /*  CRTC start            */
  503.  
  504.     outp( 0x448,1 ) ;                            /*  プライオリティレジスタ        */
  505.     outp( 0x44A,0x29 ) ;                        /*  レイヤ1:16色パレット        */
  506.     for ( cnt=0; cnt<16; cnt++ ) {
  507.         outp( 0xFD90,cnt ) ;                    /*  palette no.            */
  508.         outp( 0xFD92,_pal161.pal[cnt].b ) ;        /*  Blue                */
  509.         outp( 0xFD94,_pal161.pal[cnt].r ) ;        /*  Red                    */
  510.         outp( 0xFD96,_pal161.pal[cnt].g ) ;        /*  Green                */
  511.     }
  512.  
  513.     outp( 0x448,1 ) ;                            /*  プライオリティレジスタ        */
  514.     outp( 0x44A,0x09 ) ;                        /*  レイヤ0:16色パレット        */
  515.     for ( cnt=0; cnt<16; cnt++ ) {
  516.         outp( 0xFD90,cnt ) ;                    /*  palette no.            */
  517.         outp( 0xFD92,_pal160.pal[cnt].b ) ;        /*  Blue                */
  518.         outp( 0xFD94,_pal160.pal[cnt].r ) ;        /*  Red                    */
  519.         outp( 0xFD96,_pal160.pal[cnt].g ) ;        /*  Green                */
  520.     }
  521.  
  522.     outp( 0x448,1 ) ;                            /*  プライオリティレジスタ        */
  523. #if 0
  524.     outp( 0x44A,_vdc[1] ) ;
  525. #endif
  526.  
  527.     for ( cnt=0; cnt<TMP_SIZE; cnt++ ) _tmp[cnt] = 0 ;
  528.     switch ( _para.disp ) {                        /*  表示ページ            */
  529.     case 1:    outp( 0x44A,0x09 ) ;                /*  page0のみ表示        */
  530.             for ( cnt=256, off=VRAM_HALF; cnt<512; cnt++, off+=TMP_SIZE ) {
  531.                 movedata( getds(),(unsigned int)_tmp,0x120,off,TMP_SIZE ) ;
  532.             }
  533.             break ;
  534.     case 2:    outp( 0x44A,0x20 ) ;                /*  page1のみ表示        */
  535.             for ( cnt=0, off=0; cnt<256; cnt++, off+=TMP_SIZE ) {
  536.                 movedata( getds(),(unsigned int)_tmp,0x120,off,TMP_SIZE ) ;
  537.             }
  538.             break ;
  539.     case 3:    outp( 0x44A,0x20 ) ;                /*  page0前面表示        */
  540.             break ;
  541.     case 4:    outp( 0x44A,0x09 ) ;                /*  page1前面表示        */
  542.             break ;
  543.     }
  544.     outp( 0xFDA0,0x0A ) ;                        /*  page0&1表示            */
  545. }
  546.  
  547. void setdisp( void )
  548. {
  549.     int        zx0, zy0, zx1, zy1 ;
  550.  
  551.     _para.sx0 = _para.sy0 = _para.sx1 = _para.sy1 = 0 ;
  552.     _para.vx0 = _para.vy0 = _para.vx1 = _para.vy1 = 0 ;
  553.     if ( _para.p0 < 0 ) {                        /*  MS-DOS                */
  554.         setdos() ;
  555.         return ;
  556.     }
  557.     EGB_resolution( Gwork,0,_para.p0 ) ;        /*  page0                */
  558.     EGB_resolution( Gwork,1,_para.p1 ) ;        /*  page1                */
  559.     zx0 = _para.zx0 == 3 ? 4 : _para.zx0 ;
  560.     zy0 = _para.zy0 == 3 ? 4 : _para.zy0 ;
  561.     EGB_writePage( Gwork,0 ) ;                    /*  page0を処理開始        */
  562.     if ( _para.p0 >= 12 && _para.p0 <= 14 ) {    /*  256色                */
  563.         EGB_palette( Gwork,0,(char *)&_pal256 ) ;
  564.     } else if ( _para.p0 >= 1 && _para.p0 <= 4 ) {    /*  16色            */
  565.         EGB_palette( Gwork,0,(char *)&_pal160 ) ;
  566.     }
  567.     EGB_displayStart( Gwork,2,zx0,zy0 ) ;        /*  画面の拡大            */
  568.     EGB_displayStart( Gwork,0,0,0 ) ;            /*  表示開始位置        */
  569.     EGB_displayStart( Gwork,1,0,0 ) ;            /*  仮想画面開始位置    */
  570.     EGB_displayStart( Gwork,3,_sx0,_sy0 ) ;        /*  表示画面の大きさ    */
  571.     if ( _para.p0 < 12 ) {                        /*  2画面モード            */
  572.         zx1 = _para.zx1 == 3 ? 4 : _para.zx1 ;
  573.         zy1 = _para.zy1 == 3 ? 4 : _para.zy1 ;
  574.         EGB_writePage( Gwork,1 ) ;                /*  page1を処理開始        */
  575.         if ( _para.p1 >= 1 && _para.p1 <= 4 ) {    /*  16色                */
  576.             EGB_palette( Gwork,0,(char *)&_pal161 ) ;
  577.         }
  578.         EGB_displayStart( Gwork,2,zx1,zy1 ) ;    /*  画面の拡大            */
  579.         EGB_displayStart( Gwork,0,0,0 ) ;        /*  表示開始位置        */
  580.         EGB_displayStart( Gwork,1,0,0 ) ;        /*  仮想画面開始位置    */
  581.         EGB_displayStart( Gwork,3,_sx1,_sy1 ) ;    /*  表示画面の大きさ    */
  582.     }
  583.  
  584.     switch ( _para.disp ) {
  585.     case 1:                                        /*  page0のみ表示        */
  586.             if ( _para.p0 < 12 ) {                /*  2画面モード            */
  587.                 EGB_writePage( Gwork,1 ) ;        /*  page1を処理開始        */
  588.                 EGB_paintMode( Gwork,0x20 ) ;    /*  面塗り                */
  589.                 EGB_writeMode( Gwork,M_PSET ) ;    /*  PSET描画            */
  590.                 if ( _para.p1 >= 1 && _para.p1 <= 4 ) {    /*  16色        */
  591.                     EGB_color( Gwork,C_BACK,C_BLACK ) ;    /*  背景色        */
  592.                 } else {                        /*  32K色                */
  593.                     EGB_color( Gwork,C_BACK,0x8000 ) ;    /*  背景色        */
  594.                 }
  595.                 EGB_clearScreen( Gwork ) ;        /*  前画面クリア            */
  596.                 EGB_displayPage( Gwork,1,3 ) ;    /*  page1前面表示        */
  597.             } else {                            /*  1画面モード            */
  598.                 EGB_displayPage( Gwork,0,1 ) ;    /*  page0のみ表示        */
  599.             }
  600.             break ;
  601.     case 2:                                        /*  page1のみ表示        */
  602.             EGB_writePage( Gwork,0 ) ;            /*  page0を処理開始        */
  603.             EGB_paintMode( Gwork,0x20 ) ;        /*  面塗り                */
  604.             EGB_writeMode( Gwork,M_PSET ) ;        /*  PSET描画            */
  605.             if ( _para.p0 >= 1 && _para.p0 <= 4 ) {        /*  16色        */
  606.                 EGB_color( Gwork,C_BACK,C_BLACK ) ;        /*  背景色        */
  607.             } else {                            /*  32K色                */
  608.                 EGB_color( Gwork,C_BACK,0x8000 ) ;        /*  背景色        */
  609.             }
  610.             EGB_clearScreen( Gwork ) ;            /*  前画面クリア            */
  611.             EGB_displayPage( Gwork,0,3 ) ;        /*  page0前面表示        */
  612.             break ;
  613.     case 3:    EGB_displayPage( Gwork,0,3 ) ;        /*  page0前面表示        */
  614.             break ;
  615.     case 4:    EGB_displayPage( Gwork,1,3 ) ;        /*  page1前面表示        */
  616.             break ;
  617.     }
  618. }
  619.  
  620. void menu( void )
  621. {
  622.     int        cnt ;
  623.  
  624.     MOS_disp( FALSE ) ;                            /*  マウス非表示            */
  625.     ginit() ;                                    /*  EGB初期化            */
  626.     EGB_color( Gwork,C_FRONT,C_HYELLOW ) ;        /*  文字色                */
  627.     glocate( _dpara[SEL_TIT].xs,_dpara[SEL_TIT].ys+15 ) ;
  628.     gputs( _msg[0] ) ;
  629.     glocate( _dpara[SEL_EXEC].xs,_dpara[SEL_EXEC].ys+15 ) ;
  630.     gputs( _msg[19] ) ;
  631.     EGB_color( Gwork,C_FRONT,C_HWHITE ) ;        /*  文字色                */
  632.     for ( cnt=1; cnt<19; cnt++ ) {
  633.         glocate( _dpara[cnt].xs,_dpara[cnt].ys+15 ) ;
  634.         gputs( _msg[cnt] ) ;
  635.     }
  636.     EGB_paintMode( Gwork,0x20 ) ;                /*  面塗り                */
  637.     EGB_writeMode( Gwork,M_XOR ) ;                /*  XOR描画                */
  638.     EGB_color( Gwork,C_PAINT,C_HLBLUE ) ;        /*  面塗り色            */
  639.  
  640.     if ( _para.p0 < 0 ) {                        /*  MS-DOS                */
  641.         reverse( -1,SEL_DOS ) ;                    /*  MS-DOS画面            */
  642.     } else {
  643.         reverse( -1,_para.p0 ) ;                /*  page0の画面モード        */
  644.         if ( _para.p0 < 12 ) {                    /*  2画面モード            */
  645.             reverse( -1,_para.p1+P1_1-1 ) ;        /*  page1の画面モード        */
  646.         }
  647.     }
  648.     reverse( -1,_para.disp+D0_0-1 ) ;            /*    表示ページ            */
  649.     reverse( -1,_para.zx0+P0_X1-1 ) ;            /*  page0のX倍率        */
  650.     reverse( -1,_para.zy0+P0_Y1-1 ) ;            /*  page0のY倍率        */
  651.     if ( _para.p0 < 12 ) {                        /*  2画面モード            */
  652.         reverse( -1,_para.zx1+P1_X1-1 ) ;        /*  page1のX倍率        */
  653.         reverse( -1,_para.zy1+P1_Y1-1 ) ;        /*  page1のY倍率        */
  654.     }
  655. }
  656.  
  657. void move_disp( int status )
  658. {
  659.     int        zm ;
  660.  
  661.     if ( !(status & PAD_A) ) {                    /*  A on (page1)        */
  662.         if ( _para.p0 >= 12 ) return ;            /*  1画面モード            */
  663.         if ( _tim1 < 1 ) return ;
  664.         if ( !(status & PAD_RIGHT) )    _para.vx1++ ;
  665.         if ( !(status & PAD_LEFT) )        _para.vx1-- ;
  666.         if ( !(status & PAD_DOWN) )        _para.vy1++ ;
  667.         if ( !(status & PAD_UP) )        _para.vy1-- ;
  668.         _tim1 = 0 ;
  669.         if ( _para.p0 < 0 ) {                    /*  MS-DOS画面            */
  670.                                                 /*  テキスト画面 1024*512    */
  671.             outp( 0x440,0x15 ) ;                /*  FA1                    */
  672.             outpw( 0x442,_para.vx1/2+_para.vy1*_crtc[0x18] ) ;
  673.             zm = _para.zx1 == 3 ? 4 : _para.zx1 ;
  674.             outp( 0x440,0x16 ) ;                /*  HAJ1                */
  675.             outpw( 0x442,_crtc[0x0B]-zm*(_para.vx1&0x01) ) ;
  676.             return ;
  677.         }
  678.         EGB_writePage( Gwork,1 ) ;                /*  page1描画            */
  679.         if ( EGB_displayStart( Gwork,1,_para.vx1,_para.vy1 ) ) {
  680.             if ( !(status & PAD_RIGHT) )    --_para.vx1 ;
  681.             if ( !(status & PAD_LEFT) )        ++_para.vx1 ;
  682.             if ( !(status & PAD_DOWN) )        --_para.vy1 ;
  683.             if ( !(status & PAD_UP) )        ++_para.vy1 ;
  684.         }
  685.     } else {                                    /*  A/B off (page0)        */
  686.         if ( _tim0 < 1 ) return ;
  687.         if ( !(status & PAD_RIGHT) )    _para.vx0++ ;
  688.         if ( !(status & PAD_LEFT) )        _para.vx0-- ;
  689.         if ( !(status & PAD_DOWN) )        _para.vy0++ ;
  690.         if ( !(status & PAD_UP) )        _para.vy0-- ;
  691.         _tim0 = 0 ;
  692.         if ( _para.p0 < 0 ) {                    /*  MS-DOS画面            */
  693.                                                 /*  グラフィック画面 640*819    */
  694.             outp( 0x440,0x11 ) ;                /*  FA0                    */
  695.             outpw( 0x442,_para.vx0/2+_para.vy0*_crtc[0x14] ) ;
  696.             zm = _para.zx0 == 3 ? 4 : _para.zx0 ;
  697.             outp( 0x440,0x12 ) ;                /*  HAJ0                */
  698.             outpw( 0x442,_crtc[0x09]-zm*(_para.vx0&0x01) ) ;
  699.             return ;
  700.         }
  701.         EGB_writePage( Gwork,0 ) ;                /*  page0描画            */
  702.         if ( EGB_displayStart( Gwork,1,_para.vx0,_para.vy0 ) ) {
  703.             if ( !(status & PAD_RIGHT) )    --_para.vx0 ;
  704.             if ( !(status & PAD_LEFT) )        ++_para.vx0 ;
  705.             if ( !(status & PAD_DOWN) )        --_para.vy0 ;
  706.             if ( !(status & PAD_UP) )        ++_para.vy0 ;
  707.         }
  708.     }
  709. }
  710.  
  711. void start_disp( int status )
  712. {
  713.     if ( !(status & PAD_A) ) {                    /*  A on (page1)        */
  714.         if ( _para.p0 >= 12 ) return ;            /*  1画面モード            */
  715.         if ( _tim1 < 1 ) return ;
  716.         if ( !(status & PAD_RIGHT) )    _para.sx1++ ;
  717.         if ( !(status & PAD_LEFT) )        _para.sx1-- ;
  718.         if ( !(status & PAD_DOWN) )        _para.sy1++ ;
  719.         if ( !(status & PAD_UP) )        _para.sy1-- ;
  720.         _tim1 = 0 ;
  721.         if ( _para.p0 < 0 ) {                    /*  MS-DOS画面            */
  722.             return ;
  723.         }
  724.         EGB_writePage( Gwork,1 ) ;                /*  page1描画            */
  725.         if ( EGB_displayStart( Gwork,0,_para.sx1,_para.sy1 ) ) {
  726.             if ( !(status & PAD_RIGHT) )    --_para.sx1 ;
  727.             if ( !(status & PAD_LEFT) )        ++_para.sx1 ;
  728.             if ( !(status & PAD_DOWN) )        --_para.sy1 ;
  729.             if ( !(status & PAD_UP) )        ++_para.sy1 ;
  730.         }
  731.     } else {                                    /*  A/B off (page0)        */
  732.         if ( _tim0 < 1 ) return ;
  733.         if ( !(status & PAD_RIGHT) )    _para.sx0++ ;
  734.         if ( !(status & PAD_LEFT) )        _para.sx0-- ;
  735.         if ( !(status & PAD_DOWN) )        _para.sy0++ ;
  736.         if ( !(status & PAD_UP) )        _para.sy0-- ;
  737.         _tim0 = 0 ;
  738.         if ( _para.p0 < 0 ) {                    /*  MS-DOS画面            */
  739.             return ;
  740.         }
  741.         EGB_writePage( Gwork,0 ) ;                /*  page0描画            */
  742.         if ( EGB_displayStart( Gwork,0,_para.sx0,_para.sy0 ) ) {
  743.             if ( !(status & PAD_RIGHT) )    --_para.sx0 ;
  744.             if ( !(status & PAD_LEFT) )        ++_para.sx0 ;
  745.             if ( !(status & PAD_DOWN) )        --_para.sy0 ;
  746.             if ( !(status & PAD_UP) )        ++_para.sy0 ;
  747.         }
  748.     }
  749. }
  750.  
  751. void reset_disp( void )
  752. {
  753.     _para.sx0 = _para.sy0 = _para.sx1 = _para.sy1 = 0 ;
  754.     _para.vx0 = _para.vy0 = _para.vx1 = _para.vy1 = 0 ;
  755.     if ( _para.p0 < 0 ) {                        /*  MS-DOS画面            */
  756.         _crtc[0x11] = _crtc_dos[0x11] ;
  757.         crtc_out( 0x11 ) ;                        /*  page0フレーム先頭(FA0)    */
  758.         _crtc[0x12] = _crtc_dos[0x12] ;
  759.         crtc_out( 0x12 ) ;                        /*  水平アジャスト(HAJ0)    */
  760.         _crtc[0x15] = _crtc_dos[0x15] ;
  761.         crtc_out( 0x15 ) ;                        /*  page1フレーム先頭(FA1)    */
  762.         _crtc[0x16] = _crtc_dos[0x16] ;
  763.         crtc_out( 0x16 ) ;                        /*  水平アジャスト(HAJ1)    */
  764.         return ;
  765.     } else if ( _para.p0 < 12 ) {                /*  2画面モード            */
  766.         EGB_writePage( Gwork,1 ) ;                /*  page1描画            */
  767.         EGB_displayStart( Gwork,0,_para.sx1,_para.sy1 ) ;
  768.         EGB_displayStart( Gwork,1,_para.vx1,_para.vy1 ) ;
  769.     }
  770.     EGB_writePage( Gwork,0 ) ;                    /*  page0描画            */
  771.     EGB_displayStart( Gwork,0,_para.sx0,_para.sy0 ) ;
  772.     EGB_displayStart( Gwork,1,_para.vx0,_para.vy0 ) ;
  773. }
  774.  
  775. void mos_action( void )
  776. {
  777.     int        mbot, mx, my ;
  778.     int        status, status2;
  779.  
  780.     SND_joy_out( 0x0F,&status,&status2 );        /*  誤動作防止        */
  781.     while ( TRUE ) {
  782.         MOS_rdpos( &mbot,&mx,&my ) ;            /*  マウス情報取得            */
  783.         if ( mbot == MOS_RIGHT ) return ;        /*  右クリック                */
  784.         if ( mbot == MOS_LEFT ) {                /*  左クリック (reset)        */
  785.             reset_disp() ;                        /*  表示リセット            */
  786.             continue ;
  787.         }
  788.         if ( SND_joy_in_2( 0,&status ) ) continue ;
  789.         status &= 0x000000FF;
  790.         if ( (status & 0xFF ) == 0xFF ) continue ;
  791.         if ( !(status & PAD_SELECT) ) return ;    /*  SELECT on (menu)    */
  792.         if ( !(status & PAD_START) ) {            /*  RUN on (reset)        */
  793.             reset_disp() ;                        /*  表示リセット            */
  794.             continue ;
  795.         }
  796.         if ( (status & PAD_MOVE) == PAD_MOVE ) continue ;
  797.         if ( !(status & PAD_B) ) {                /*  B on (reset)        */
  798.             start_disp( status ) ;                /*  表示開始位置変更    */
  799.         } else {
  800.             move_disp( status ) ;                /*  仮想画面中の移動    */
  801.         }
  802.     }
  803. }
  804.  
  805. void disp( void )
  806. {
  807.     int        sel, page ;
  808.  
  809.     while ( TRUE ) {
  810.         menu() ;                                /*  初期画面表示        */
  811.         if ( (sel=select()) == SEL_END ) break ;    /*  メニュー選択        */
  812.         to_vram() ;                                /*  VRAMへデータ転送        */
  813.         page = _para.disp ;
  814.         if ( sel == SEL_TIF && _para.disp > 2 ) _para.disp -= 2 ;
  815.         setdisp() ;                                /*  画面設定            */
  816.         if ( sel == SEL_TIF ) {
  817.             tiff_save() ;                        /*  TIFF保存            */
  818.             _para.disp = page ;
  819.         } else {
  820.             mos_action() ;                        /*  マウス操作                */
  821.         }
  822.     } ;
  823.     mosBreak() ;                                /*  マウス開放待ち            */
  824.     EGB_resolution( Gwork,0,12 ) ;                /*  page0:256,1画面モード    */
  825.     EGB_resolution( Gwork,1,12 ) ;                /*  page1:error            */
  826.     EGB_writePage( Gwork,0 ) ;                    /*  page0描画            */
  827.     EGB_paintMode( Gwork,0x20 ) ;                /*  面塗り                */
  828.     EGB_writeMode( Gwork,M_PSET ) ;                /*  PSET描画            */
  829.     EGB_color( Gwork,C_BACK,C_BLACK ) ;            /*  背景色                */
  830.     EGB_clearScreen( Gwork ) ;                    /*  画面クリア                */
  831. }
  832.  
  833. int getpal( void )
  834. {
  835.     int        cnt ;
  836.  
  837.     _pal256.npal = (_DWORD)256 ;
  838.     for ( cnt=0; cnt<256; cnt++ ) {
  839.         _pal256.pal[cnt].no = (_DWORD)cnt ;
  840.         if ( fread( &_pal256.pal[cnt].b,1,1,_para.fp ) != 1 ) return 1 ;
  841.         if ( fread( &_pal256.pal[cnt].r,1,1,_para.fp ) != 1 ) return 1 ;
  842.         if ( fread( &_pal256.pal[cnt].g,1,1,_para.fp ) != 1 ) return 1 ;
  843.         _pal256.pal[cnt].zero = (_BYTE)0 ;
  844.     }
  845.     _pal160.npal = (_DWORD)16 ;
  846.     for ( cnt=0; cnt<16; cnt++ ) {
  847.         _pal160.pal[cnt].no = (_DWORD)cnt ;
  848.         if ( fread( &_pal160.pal[cnt].b,1,1,_para.fp ) != 1 ) return 1 ;
  849.         if ( fread( &_pal160.pal[cnt].r,1,1,_para.fp ) != 1 ) return 1 ;
  850.         if ( fread( &_pal160.pal[cnt].g,1,1,_para.fp ) != 1 ) return 1 ;
  851.         _pal160.pal[cnt].zero = (_BYTE)0 ;
  852.     }
  853.     _pal161.npal = (_DWORD)16 ;
  854.     for ( cnt=0; cnt<16; cnt++ ) {
  855.         _pal161.pal[cnt].no = (_DWORD)cnt ;
  856.         if ( fread( &_pal161.pal[cnt].b,1,1,_para.fp ) != 1 ) return 1 ;
  857.         if ( fread( &_pal161.pal[cnt].r,1,1,_para.fp ) != 1 ) return 1 ;
  858.         if ( fread( &_pal161.pal[cnt].g,1,1,_para.fp ) != 1 ) return 1 ;
  859.         _pal161.pal[cnt].zero = (_BYTE)0 ;
  860.     }
  861.     if ( _para.buf != NULL ) {
  862.         if ( fread( _para.buf,1,VRAM_SIZE,_para.fp ) != VRAM_SIZE ) return 1 ;
  863.     }
  864.     return 0 ;
  865. }
  866.  
  867. void errWait( void )
  868. {
  869.     locate( 2,6 ) ;                                /*  2桁,6行目            */
  870.     gputs( "マウスをクリックして下さい." ) ;
  871.     while ( mosButton() == MOS_NONE ) ;            /*  マウスクリックを待つ        */
  872.     mosBreak() ;                                /*  マウス開放待ち            */
  873. }
  874.  
  875. void usage( void )
  876. {
  877.     locate( 2,4 ) ;                                /*  2桁,4行目            */
  878.     gputs( "Usage:  PVD  ファイル名.PVS" ) ;
  879.     errWait() ;
  880.     MOS_end() ;                                    /*  MOS終了処理            */
  881.     exit( EXIT_FAILURE ) ;
  882. }
  883.  
  884. void openError( char *fname )
  885. {
  886.     locate( 2,4 ) ;                                /*  2桁,4行目            */
  887.     gprintf( "file <%s> open error.",fname ) ;
  888.     errWait() ;
  889.     MOS_end() ;                                    /*  MOS終了処理            */
  890.     exit( EXIT_FAILURE ) ;
  891. }
  892.  
  893. int main( int ac,char *av[] )
  894. {
  895.     ginit() ;                                    /*  EGB初期化            */
  896.     minit() ;                                    /*  MOS初期化            */
  897.     locate( 2,2 ) ;                                /*  2桁,2行目            */
  898.     gputs( "PVD  Version 0.70  (C)パオパオ 1994." ) ;
  899.     if ( ac < 2 ) usage() ;
  900.     _harderr_retry() ;                            /*  致命的エラー自動回避    */
  901.     if ( (_para.fp=fopen( av[1],"rb" )) == NULL ) openError( av[1] ) ;
  902.     _para.fname = av[1] ;                        /*  ファイル名                */
  903.     _para.buf = (char *)malloc( VRAM_SIZE ) ;    /*  512KB                */
  904.     if ( _para.buf != NULL ) {                    /*  メモリ確保OK!            */
  905.         locate( 16,15 ) ;                        /*  16桁,15行目            */
  906.         gputs( "ファイルを読んでいますので、しばらくお待ち下さい." ) ;
  907.     }
  908.     if ( !getpal() ) {                            /*  パレット読み込み        */
  909.         TIM_TIME timer ;
  910.         unsigned timeno ;
  911.         timer.mode = 0 ;
  912.         timer.inf = 0 ;
  913.         BSETCODEADR( (char *)&timer.adr,int_handler ) ;
  914.         timer.hcycle = 0x00 ;
  915.         timer.lcycle = 1 ;                        /*  10ms                 */
  916.         TIM_settime( &timer, (int *)&timeno ) ;
  917.         disp() ;                                /*  データ表示            */
  918.         TIM_clrtime( timeno ) ;
  919.     } else {
  920.         locate( 16,15 ) ;                        /*  16桁,15行目            */
  921.         gputs( "                                                 " ) ;
  922.         locate( 2,4 ) ;                            /*  2桁,4行目            */
  923.         gprintf( "file <%s> read error. ( .PVS ファイルですか? )",av[1] ) ;
  924.         errWait() ;
  925.     }
  926.     if ( _para.buf != NULL ) free( _para.buf ) ;
  927.     fclose( _para.fp ) ;
  928.     MOS_end() ;                                    /*  MOS終了処理            */
  929.     return 0 ;
  930. }
  931.  
  932. /*    HISTORY
  933. -----------------------------------------------------------------------------
  934. *    1994.01.03 : CREATE
  935. *    1994.01.10 : パッド操作で画面スクロール,表示位置変更をできるようにした.
  936. *    1994.01.13 : TIFF保存できるようにした.
  937. ---------------------------------------------------------------------------*/
  938.